In mathematics, a prime number (or a prime) is a
natural number which has exactly two distinct natural number divisors: 1 and
itself.
Super-prime numbers are the elements of the
subsequence of prime-numbers that occupy prime-numbered positions within the
sequence of all prime numbers. That is, if p(i) denotes the ith prime number, the numbers in this sequence are
those of the form p(p(i)) or Primes
with a prime index in the sequence of prime numbers (the 2nd, 3rd, 5th, ...
prime).
Your task is to generate all super primes < 107.
Input.
There is NO input for this
problem.
Output. Print all super-primes < 107 in
ascending order, one per line.
Sample
Output – first few lines
3
5
11
17
31
41
59
...
решето Эратосфена
Сгенерируем решето
Эратосфена для чисел от 1 до 107. Перенумеруем простые
числа. Далее выведем такие простые числа, номера которых являются простыми.
Первым простым числом согласно условия задачи является 2.
Пример
Перенумеруем простые числа:
первым простым числом является 2, вторым простым 3, третьим простым 5 и так
далее.
Простыми числами,
находящимися на простых позициях (2, 3, 5, 7, 11, …), будут 3, 5, 11, 17, 31, …
.
Реализация алгоритма
#include <stdio.h>
#include <math.h>
#define MAX 10000001
char primes[MAX];
int i, c;
void gen_primes(void)
{
int i, j;
for(i = 0; i < MAX; i++) primes[i] = 1;
for(i = 2; i <= (int)sqrt(1.0*MAX);
i++)
if (primes[i])
for(j = i * i; j < MAX; j += i) primes[j] = 0;
}
int main(void)
{
gen_primes();
c = 1;
for(i = 3; i < MAX; i++)
if (primes[i])
{
c++;
if (primes[c]) printf("%d\n",i);
}
return 0;
}